import subprocess
import whisper
import requests
import json
import os


def extract_audio(video_file, audio_file):
    """
    从视频文件中提取音频并保存为指定的音频文件。

    参数:
    video_file: 视频文件的路径
    audio_file: 输出音频文件的路径
    """
    # 如果输出音频文件已存在，先删除它
    if os.path.exists(audio_file):
        os.remove(audio_file)

    # 使用 ffmpeg 提取音频
    command = [
        "ffmpeg",
        "-i",
        video_file,
        "-q:a",
        "0",  # 设置音频质量
        "-map",
        "a",  # 只提取音频流
        audio_file,
    ]
    subprocess.run(command, check=True)  # 执行命令并检查是否成功


def transcribe_audio_to_srt(audio_file, srt_file):
    """
    将音频文件转录为 SRT 字幕文件。

    参数:
    audio_file: 输入音频文件的路径
    srt_file: 输出 SRT 文件的路径
    """
    model = whisper.load_model("base")  # 加载 Whisper 模型
    result = model.transcribe(audio_file)  # 转录音频

    # 将转录结果写入 SRT 文件
    with open(srt_file, "w", encoding="utf-8") as f:
        for i, segment in enumerate(result["segments"]):
            start_time = segment["start"]
            end_time = segment["end"]
            text = segment["text"].strip()

            # 格式化时间为 SRT 格式
            start_time_srt = format_srt_time(start_time)
            end_time_srt = format_srt_time(end_time)

            # 写入 SRT 文件
            f.write(f"{i + 1}\n")
            f.write(f"{start_time_srt} --> {end_time_srt}\n")
            f.write(f"{text}\n\n")


def format_srt_time(seconds):
    """
    将秒数转换为 SRT 时间格式。

    参数:
    seconds: 秒数
    返回值:
    格式化后的时间字符串
    """
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    seconds = seconds % 60
    milliseconds = int((seconds - int(seconds)) * 1000)
    return f"{hours:02}:{minutes:02}:{int(seconds):02},{milliseconds:03}"


def load_config(config_path):
    """
    加载配置文件以获取 API 基础 URL 和密钥。

    参数:
    config_path: 配置文件的路径
    返回值:
    base_url: API 基础 URL
    api_key: API 密钥
    """
    try:
        with open(config_path, "r") as f:
            config = json.load(f)
        return config.get("base_url"), config.get("api_key")
    except FileNotFoundError:
        print("错误：config.json 文件未找到。")
        exit()
    except json.JSONDecodeError:
        print("错误：config.json 文件格式错误。")
        exit()


def translate_and_summarize(text, config_path):
    """
    翻译并总结输入的文本。

    参数:
    text: 输入的文本
    config_path: 配置文件的路径
    返回值:
    summary_text: 总结后的文本
    """
    base_url, api_key = load_config(config_path)  # 加载配置

    # 构建 API 请求 URL
    url = f"{base_url}/chat/completions"
    headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}

    # 构建请求数据
    text_data = {
        "model": "gpt-4o-mini",
        "messages": [
            {
                "role": "user",
                "content": f"你是一个好用的视频总结助手。根据以下输入的SRT文本文件，用中文详细总结其内容。: {text}",
            }
        ],
    }

    # 发送请求并获取总结
    summary_response = requests.post(url, headers=headers, data=json.dumps(text_data))
    summary_text = ""
    if summary_response.status_code == 200:
        result = summary_response.json()
        summary_text = result["choices"][0]["message"]["content"]
    else:
        print(f"请求失败：{summary_response.status_code}")
    return summary_text


def main(video_file, audio_file, srt_file, config_path):
    """
    主函数，执行整个流程：提取音频、转录、翻译和总结。

    参数:
    video_file: 视频文件的路径
    audio_file: 输出音频文件的路径
    srt_file: 输出 SRT 文件的路径
    config_path: 配置文件的路径
    """
    # Step 1: 从视频中提取音频
    extract_audio(video_file, audio_file)

    # Step 2: 转录音频并生成 SRT 文件
    transcribe_audio_to_srt(audio_file, srt_file)

    # Step 3: 读取转录文本以进行翻译和总结
    with open(srt_file, "r", encoding="utf-8") as f:
        srt_content = f.read()

    # 翻译并总结文本
    summary_text = translate_and_summarize(srt_content, config_path)

    # 输出总结结果
    print("Summary Text:", summary_text)


if __name__ == "__main__":
    # 设置输入输出文件路径
    video_file = "./data/Write Like A Winner ｜ Write Your Best Work With Grammarly [udaihhReGAA].mp4"  # 替换为你的视频文件路径
    audio_file = "output_audio.m4a"  # 输出音频文件名
    srt_file = "output_subtitles.srt"  # 输出 SRT 文件名
    config_path = "./config/gpt.config.json"  # 替换为你的 config 文件路径

    # 执行主函数
    main(video_file, audio_file, srt_file, config_path)
